import { Controller, Get, Post, Body, Patch, Param, Delete, Query, Req, ParseIntPipe, Put, ParseArrayPipe } from '@nestjs/common';
import { RolesService } from './roles.service';
import { CreateRoleDto } from './dto/create-role.dto';
import { UpdateRoleDto } from './dto/update-role.dto';
import { PageResDto } from 'src/common/dto/page.dto';
import { RolePageQuery, RolePageVo } from './dto/search-role.dto';

@Controller('roles')
export class RolesController {
  constructor(private readonly rolesService: RolesService) { }

  /**
   * 获取角色的菜单ID集合
   */
  @Get(":roleId/menuIds")
  public async getRoleMenuIds(@Param('roleId', ParseIntPipe) roleId: number): Promise<number[]> {
    return await this.rolesService.getRoleMenuIds(roleId);

  }

  /**
  * 字典下拉列表
  * @param typeCode 
  * @returns 
  */
  @Get("/options")
  listDictOptions() {
    return this.rolesService.listDictOptions();
  }


  /**
 * 角色-列表查询
 * @param pageDto 
 * @returns 
 */
  @Get('page')
  findAll(@Req() req, @Query() pageDto: RolePageQuery): Promise<PageResDto<RolePageVo>> {

    return this.rolesService.findAll(req.user, pageDto);
  }



  /**
   * 角色-新增
   * @param pageDto 
   * @returns 
   */
  @Post()
  create(@Body() createRoleDto: CreateRoleDto) {
    return this.rolesService.create(createRoleDto);
  }


  /**
   * 角色-获取单个表单数据
   * @param id 
   * @returns 
   */
  @Get(':id/form')
  findOne(@Param('id', ParseIntPipe) id: number) {
    return this.rolesService.findOne(id);
  }



  /**
   * 角色-修改
   * @param id 
   * @param updateRoleDto 
   * @returns 
   */
  @Put(':id')
  update(@Param('id') id: string, @Body() updateRoleDto: UpdateRoleDto) {
    return this.rolesService.update(+id, updateRoleDto);
  }

  /**
   * 删除角色
   * @param id 
   * @returns 
   */
  @Delete(':ids')
  remove(@Param('ids') ids: string) {
    return this.rolesService.remove(ids);
  }


  /**
   * 分配菜单权限给角色
   */
  @Put(":roleId/menus")
  public updateRoleMenus(
    @Param("roleId", ParseIntPipe) roleId: number,
    @Body() menuIds: number[]
  ) {
    return this.rolesService.updateRoleMenus(roleId, menuIds);
  }

}
